#include "Actor.h"
#include "HuevoBlanco.h"
#include "HuevoCodorniz.h"
#include "HuevoPoche.h"
#include "HuevoReloj.h"
#include "PajaritoAzul.h"
#include "PajaritoRojo.h"
#include "PajaritoVerde.h"

using namespace TP::Juego::Arena::Actores;

Actor::Actor() {
	this->_trayectoria = NULL;
}

Actor::Actor(const string& pNombre, Rol* pRol) {
	this->_nombre = pNombre;
	this->_rol = pRol;
	this->_trayectoria = NULL;
}

Actor::~Actor() {
	if (this->_rol)
		delete this->_rol;
}

string& Actor::Nombre() {
	return this->_nombre;
}

Trayectoria* Actor::getTrayectoria() {
	return this->_trayectoria;
}

Trayectoria* Actor::setTrayectoria(Trayectoria* pTrayectoria) {
	if (pTrayectoria) {
		delete this->_trayectoria;
		this->_trayectoria = pTrayectoria;
	}
	return pTrayectoria;
}

Ticks Actor::desplazar(Ticks pTiempo) {
	if (NULL != this->_trayectoria)
		this->_trayectoria->desplazar(pTiempo);

	return pTiempo;
}

Rol* Actor::getRol() {
	return this->_rol;
}

string& Actor::setNombre(const string& pNombre) {
	this->_nombre = pNombre;
	return this->Nombre();
}

Actor* Actor::deElementoXMLGenerico(TiXmlElement* pElemento) {
	Actor* actor = NULL;
	if (pElemento) {
		if (PAJARITOAZUL == pElemento->ValueTStr())
			actor = new PajaritoAzul();

		else if (PAJARITOROJO == pElemento->ValueTStr())
			actor = new PajaritoRojo();

		else if (PAJARITOVERDE == pElemento->ValueTStr())
			actor = new PajaritoVerde();

		else if (HUEVOBLANCO == pElemento->ValueTStr())
			actor = new HuevoBlanco();

		else if (HUEVOCODORNIZ == pElemento->ValueTStr())
			actor = new HuevoCodorniz();

		else if (HUEVOPOCHE == pElemento->ValueTStr())
			actor = new HuevoPoche();

		else if (HUEVORELOJ == pElemento->ValueTStr())
			actor = new HuevoReloj();

		if (actor)
			actor->deElementoXML(pElemento);
	}
	return actor;
}

double Actor::getVida() {
	return _vida;
}

void Actor::setVida(double vida) {
	_vida = vida;
}

void Actor::destruir() {
	_vida = 0;
}

bool Actor::destruido() const {
	return _vida <= 0;
}

void Actor::setEsEnemigo(bool esEnemigo) {
	_enemigo = esEnemigo;
}

bool Actor::esEnemigo() const {
	return _enemigo;
}

void Actor::decrementarEnergia(double cantidadEnergia) {
	if (cantidadEnergia >= _vida)
		destruir();
	else
		_vida -= cantidadEnergia;
}

void Actor::_obtenerAtributosDeRecta(Posicion *pos_inicial, Posicion *pos_final,
		double &pendiente, double &puntoDePaso) {
	pendiente = (pos_final->Y() - pos_inicial->Y()) / (pos_final->X() - 
			pos_inicial->X());
	puntoDePaso = pos_inicial->Y() - (pendiente * pos_inicial->X());
}